package com.eva.framework.config;

import com.eva.framework.cache.CacheProxy;
import com.eva.framework.common.constants.CacheKeys;
import com.eva.framework.common.utils.Utils;
import com.eva.framework.config.model.SystemConfigCache;
import org.apache.commons.lang3.StringUtils;

import java.util.Collection;
import java.util.Map;

/**
 * 系统配置帮助类
 * 用于方便获取应用的系统配置
 *
 * @version v5.1.0
 */
public class SystemConfigHelper {

    // 数据作用域，取值为application-config.yml中的id，为空时将自动读取
    private final String dataScope;

    // 应用配置，用于未指定数据作用域时读取id作为作用域
    private final AppConfig appConfig;

    // 缓存
    private final CacheProxy<String, Map<String, SystemConfigCache>> cacheProxy;

    private SystemConfigHelper (String dataScope) {
        this.dataScope = dataScope;
        this.appConfig = Utils.SpringContext.getBean(AppConfig.class);
        this.cacheProxy = Utils.SpringContext.getBean(CacheProxy.class);
    }

    /**
     * 构建实例
     *
     * @return SystemConfigHelper
     */
    public static SystemConfigHelper build () {
        return new SystemConfigHelper(null);
    }

    /**
     * 构建实例
     *
     * @param dataScope 数据作用域，取值为application-config.yml中的id，为空时将自动读取
     * @return SystemConfigHelper
     */
    public static SystemConfigHelper build (String dataScope) {
        return new SystemConfigHelper(dataScope);
    }

    /**
     * 获取系统配置内容
     *
     * @param configCode 配置编码
     * @return 配置值
     */
    public String get (String configCode) {
        SystemConfigCache cache = cacheProxy
                .get(this.getCacheKey())
                .get(configCode);
        if (cache == null) {
            return null;
        }
        return cache.getValue();
    }

    /**
     * 获取系统配置列表
     *
     * @return Collection<SystemConfigCache>
     */
    public Collection<SystemConfigCache> getList() {
        return cacheProxy.get(this.getCacheKey()).values();
    }

    /**
     * 获取系统配置列表
     *
     * @return Collection<SystemConfigCache>
     */
    public Map<String, SystemConfigCache> getMap() {
        return cacheProxy.get(this.getCacheKey());
    }

    /**
     * 获取缓存键，格式：{应用ID}_{CacheKeys.SYSTEM_CONFIGS}
     *
     * @return String
     */
    public String getCacheKey () {
        return this.getDataScope() + "_" + CacheKeys.SYSTEM_CONFIGS;
    }

    /**
     * 获取数据作用域
     *
     * @return String
     */
    public String getDataScope () {
        if (StringUtils.isBlank(this.dataScope)) {
            return appConfig.getId();
        }
        return this.dataScope;
    }
}
